package com.stefanini.pe.bbva.bp.in.controller;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;
import javax.servlet.http.HttpSession;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.pe.bbva.utils.Constantes;
import com.stefanini.pe.bbva.bp.in.bo.iface.ClientesAnexosBOIface;
import com.stefanini.pe.bbva.bp.in.security.AuthorizationService;
import com.stefanini.pe.bbva.bp.in.to.Cliente;
import com.stefanini.pe.bbva.bp.in.to.ClienteAnexos;
import com.stefanini.pe.bbva.bp.in.to.UsuarioSesion;
import com.stefanini.pe.bbva.bp.in.utils.Archivo;
import com.stefanini.pe.bbva.bp.in.utils.SpringApplicationContext;

@Controller
@RequestScoped
public class ClientesAnexosController{
	
	@Autowired
	private ClientesAnexosBOIface clientesAnexosBO;
	
	private ClienteAnexos clienteAnexos;
	private List<ClienteAnexos> listaClienteAnexos;
	
	private StreamedContent filePDF;
	private ArrayList<Archivo> files;

	private UploadedFile fileUploaded;

	public void onPageLoad(ComponentSystemEvent event) {
		try {
			AuthorizationService auth = (AuthorizationService)SpringApplicationContext.getBean("authorizationService");
			if (auth.isSessionClientAndContextValide() && !FacesContext.getCurrentInstance().isPostback()) {
				System.out.println("ClientesAnexosController... is not Postback");
				initAll();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void initAll(){
		clienteAnexos = new ClienteAnexos();
		listaClienteAnexos = null;
		files = new ArrayList<Archivo>();
		filePDF = null;
	}
			
	public void insertClienteAnexos(){
		try{			
			FacesContext ctx = FacesContext.getCurrentInstance();
			UsuarioSesion user=	(UsuarioSesion)((HttpSession) ctx.getExternalContext().getSession(false)).
										getAttribute(Constantes.USUARIO_SESSION);
			Cliente clienteSession = (Cliente)((HttpSession) ctx.getExternalContext().getSession(false)).
										getAttribute(Constantes.OBJETO_CLIENTE_SESSION);
			this.clienteAnexos.setCodcliente(clienteSession.getCodcliente());
			this.clienteAnexos.setIdUsuario(user.getRegistroHost());
			if(files != null && files.size()>0){
				this.clienteAnexos.setArchivo(files.get(0).getData());
				this.clienteAnexos.setNomArchivo(files.get(0).getName());		
				String reps = clientesAnexosBO.guardarClienteAnexo(this.clienteAnexos);
				files = new ArrayList<Archivo>();
				
				FacesContext.getCurrentInstance().addMessage(null, 
						new FacesMessage(FacesMessage.SEVERITY_INFO,reps, ""));
				buscarAnexos();
			}else{
				System.out.println("Adjunte un archivo");
				FacesContext.getCurrentInstance().addMessage(null, 
						new FacesMessage(FacesMessage.SEVERITY_ERROR,"Adjunte un archivo", "..."));
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void buscarAnexos(){
		try{
			listaClienteAnexos = null;
			
			HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
			Cliente clienteSession = (Cliente)session.getAttribute(Constantes.OBJETO_CLIENTE_SESSION);
			this.clienteAnexos.setCodcliente(clienteSession.getCodcliente());
			
			listaClienteAnexos = clientesAnexosBO.buscarClienteAnexo(this.clienteAnexos);
			
			if(listaClienteAnexos != null && listaClienteAnexos.size()>0){
				FacesContext.getCurrentInstance().addMessage(null, 
					new FacesMessage(FacesMessage.SEVERITY_INFO,"Se encontraron "+listaClienteAnexos.size()+" documentos", "..."));  
			}else{
				FacesContext.getCurrentInstance().addMessage(null, 
					new FacesMessage(FacesMessage.SEVERITY_ERROR,"No hay Documentos ", "..."));
			}
		}catch(Exception e){
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, 
					new FacesMessage(FacesMessage.SEVERITY_WARN,"Ocurrio un Error al buscar Anexos ", "..."));
		}	
	}
	
	public void resetModalInsertAnexo(){
		clienteAnexos = new ClienteAnexos();
		files = new ArrayList<Archivo>();
	}

	public void handleFileUpload(FileUploadEvent event)throws Exception{
		FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
        
        UploadedFile item = event.getFile();
        
        Archivo file = new Archivo();
        
        file.setName(item.getFileName());
        file.setMime(item.getContentType());
        file.setData(item.getContents());
        files = new ArrayList<Archivo>();
        files.add(file);
    }
	
	public void prepararStreamFilePdf(Object ob){
		try {
			byte[] filePDFSelected = (byte[])ob;
			if(filePDFSelected != null){
				DefaultStreamedContent f = new DefaultStreamedContent(
						new ByteArrayInputStream(filePDFSelected),"application/pdf","archivo.pdf");
				filePDF = f;
			}else{
				filePDF = null;
			}
		} catch (Exception e) {
			filePDF = null;
			e.printStackTrace();
		}
	}

	public ClienteAnexos getClienteAnexos() {
		return clienteAnexos;
	}

	public void setClienteAnexos(ClienteAnexos clienteAnexos) {
		this.clienteAnexos = clienteAnexos;
	}
    
    public long getTimeStamp(){
        return System.currentTimeMillis();
    }

	public UploadedFile getFileUploaded() {
		return fileUploaded;
	}

	public void setFileUploaded(UploadedFile fileUploaded) {
		this.fileUploaded = fileUploaded;
	}
	
	public List<ClienteAnexos> getListaClienteAnexos() {
		return listaClienteAnexos;
	}

	public void setListaClienteAnexos(List<ClienteAnexos> listaClienteAnexos) {
		this.listaClienteAnexos = listaClienteAnexos;
	}

	public StreamedContent getFilePDF() {
		return filePDF;
	}

	public void setFilePDF(StreamedContent filePDF) {
		this.filePDF = filePDF;
	}	
}